package com.migration.service;

import com.migration.model.newdb.RiskChainEffect;
import com.migration.model.olddb.RaInfluence;
import com.migration.model.olddb.RaInfluenceLinked;
import com.migration.model.olddb.RaFaultChainsDetail;
import com.migration.model.olddb.RaFaultChainsMeasure;
import com.migration.model.olddb.RaDeviateReason;
import jakarta.persistence.EntityManager;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 事故链-影响表服务接口
 */
public interface RiskChainEffectService {

    /**
     * 迁移影响节点数据
     *
     * @param oldEntityManager 旧数据库实体管理器
     * @param newEntityManager 新数据库实体管理器
     * @param influenceMap 影响节点映射
     * @param sourceIdToInfluenceIds 原ID与影响节点ID的映射
     * @param detailList 事故链详情列表
     * @param reasonMap 原因ID到原因实体的映射
     * @return 迁移的影响节点列表
     */
    List<RiskChainEffect> migrateEffectData(
        EntityManager oldEntityManager,
        EntityManager newEntityManager,
        Map<Long, RaInfluence> influenceMap,
        Map<Long, Set<Long>> sourceIdToInfluenceIds,
        List<RaFaultChainsDetail> detailList,
        Map<Long, RaDeviateReason> reasonMap
    );

    /**
     * 获取所有未删除的影响节点数据
     *
     * @param oldEntityManager 旧数据库实体管理器
     * @return 影响节点数据列表
     */
    List<RaInfluence> getAllInfluences(EntityManager oldEntityManager);
    
    /**
     * 构建影响节点ID映射
     *
     * @param influenceList 影响节点列表
     * @return 影响节点ID映射
     */
    Map<Long, RaInfluence> buildInfluenceMap(List<RaInfluence> influenceList);
    
    /**
     * 构建源ID与影响节点ID的映射
     *
     * @param measureList 事故链措施关系列表
     * @param detailList 事故链详情列表
     * @return 源ID与影响节点ID的映射
     */
    Map<Long, Set<Long>> buildSourceIdToInfluenceIdsMap(
        List<RaFaultChainsMeasure> measureList,
        List<RaFaultChainsDetail> detailList
    );

    /**
     * 获取所有影响关联表数据
     *
     * @param oldEntityManager 旧数据库实体管理器
     * @return 影响关联表数据列表
     */
    List<RaInfluenceLinked> getAllInfluenceLinked(EntityManager oldEntityManager);
    
    /**
     * 迁移事故链影响节点关联数据（物料、偏离和下一设备）
     *
     * @param oldEntityManager 旧数据库实体管理器
     * @param newEntityManager 新数据库实体管理器
     * @param effectList 影响节点列表
     * @param influenceLinkedList 影响关联表数据列表
     * @return 迁移的关联数据行数
     */
    int migrateEffectRelationData(
        EntityManager oldEntityManager,
        EntityManager newEntityManager,
        List<RiskChainEffect> effectList,
        List<RaInfluenceLinked> influenceLinkedList
    );
} 